En artículos anteriores expliqué cómo instalar Dokuwiki en la Raspberry.
Ahora que tengo el wiki funcionando, ha llegado el momento de crear un sistema de copias de seguridad para cuando se produzca un fallo.
En este artículo explico la primera versión del backup que tengo configurada (espero mejorarla poco a poco).
¡Allá vamos!
Ahora que tengo el wiki funcionando, ha llegado el momento de crear un sistema de copias de seguridad para cuando se produzca un fallo.
En este artículo explico la primera versión del backup que tengo configurada (espero mejorarla poco a poco).
¡Allá vamos!
Copia de seguridad... ¿de qué?
En primer lugar, hay que decidir cómo vas a hacer la copia de seguridad. El método más sencillo para disponer de una copia exacta de tu wiki es copiando toda la información. Como Dokuwiki no utiliza una base de datos, tanto el contenido como los metadatos del wiki se guardan en ficheros de texto dentro de la carpeta data; sólo tienes que hacer un zip de esta carpeta ¡y listo!
Esta va a ser la estrategia que seguiré para hacer la copia. Si quieres prescindir de la información de las versiones de las páginas y ficheros del wiki, puedes copiar sólo las carpetas con datos, pero el ahorro de disco es bastante pequeño, así que casi no merece la pena.
Copia de seguridad... ¿dónde?
El siguiente punto a decidir es dónde vamos a colocar los ficheros de la copia de seguridad. En mi caso, lo más sencillo es dejarlos en el propio pendrive donde están los datos. No es la mejor estrategia ni de lejos, pero empezaré con algo simple.
Para poder sacar los datos de la Rapsberry sin complicaciones, dejaré el fichero dentro de las carpetas públicas del servidor web y así podré descargar los ficheros con la copia desde cualquier ordenador (de casa) a través del navegador. De nuevo, no es una buena idea en general, pero para la Raspberry en mi red privada es una solución práctica.
Copia de seguridad... ¿cómo?
A través de un script. Una de las cosas más importantes a la hora de hacer las copias de seguridad es automatizar el proceso, de manera que siempre se realice la copia.
El fichero de copia de seguridad quiero que tenga un nombre como "2015-05-03-backup" o algo por el estilo. Buscando en internet, descubro un par de cosas que necesito para mi script.
Primero, que para usar variables en el script, sólo tengo que declararla al principio del script y después añadir un símbolo de $ delante del nombre cuando quiera referenciarla.
Segundo, que para obtener la fecha en el formato que quiero, necesito el comando date con la siguiente sintaxis: date +"%Y-%m%-d".
Ya tengo lo básico para empezar el script.
Creo un fichero en /media/pendrive4gb/ mediante nano /media/pendrive4gb/backupDokuwiki.sh.
En la primera lína, escribo #!/bin/bash. Esto indica la ubicación del shell que utilizamos.
Declaro una variable fecha y le asigno la salida del comando que me devuelve la fecha en el formato que quiero:
fecha=$(date +"%Y-%m-%d")
Ya que estamos, defino variables para las carpetas de origen y destino, así como para el nombre del backup:
carpeta_destino=/media/pendrive4gb/www/
carpeta_para_backup=/media/pendrive4gb/www/dokuwiki/data/
nombre_fichero=$fecha-backup.tar.gz
Para comprimir una carpeta y su contenido en la RPi, tenemos que utilizar dos comandos, en realidad: uno para "agrupar" el contenido y otro para comprimirlo. Si lanzas gzip para comprimir el contenido de una carpeta a pelo verás que lo que hace es comprimir los ficheros de la carpeta de manera individual. Para comprimirlos todos en un solo archivo, necesitamos tar.
Afortunadamente, tar permite indicar mediante un comando que queremos comprimir el resultado de agrupar los ficheros, por lo que podemos conseguir el fichero comprimido de una carpeta -y sus subcarpetas- mediante:
cd $carpeta_destino
tar czf $nombre_fichero $carpeta_para_backup
No he sabido cómo indicar que el fichero se ubique en la carpeta $carpeta_destino; seguramente es tan fácil como prefijar el nombre del fichero con la ruta donde queremos crearlo... En cualquier caso, opté por cambiar de directorio (cd) a la carpeta donde quería el fichero y ¡listo!
Las tres letras que siguen al comando tar significan: c, create (para crear el fichero indicado), z para comprimirlo mediante gzip y f para especificar el nombre del fichero a crear.
Probando el script
Sal del editor -yo utilizo nano- mediante Ctrl+X. Responde que quieres guardar los cambios y especifica el nombre del fichero.
Antes de ejecutar el fichero, en Linux debes indicar que es un fichero ejecutable. Para ello ejecuta chmod +x backupDokuwiki.sh.
Para ejecutar el script, escribe ./backupDokuwiki.sh (el comando empieza por un punto). Si todo va bien, tendrás un fichero llamado 2015-05-03-backup.tar.gz en la carpeta $carpeta_destino.
Automatizando la ejecución del backup
El siguiente paso en la creación del backup sería añadir una entrada en la tabla de trabajos programados del sistema (cron) para que ejecute el backup cada cierto tiempo. En mi caso, como suelo trabajar en el wiki los fines de semana, he pensado en programar la copia a las 02:00 de la mañana del lunes.
Para editar la programación de tareas en Linux, utiliza crontab -e. Este comando abre tu editor de texto con una copia temporal de las tareas programas mediante cron.
cron usa un sistema algo raro -en mi opinión- para especificar cuando deben ejecutarse las tareas. En primer lugar, se indica en qué minuto, después, separado por espacios, la hora del día (en formato 24h), después el día del mes (1-31), el mes, el día de la semana y finalmente, el comando a ejecutar. Échale un vistazo a la página de la Wikipedia o al manual de cron para más detalles.
En mi caso quiero que el backup se ejecute a las 02:00, cada lunes:
0 2 * * 1 /media/pendrive4gb/backupDokuwiki.sh
Es decir, algo así como "el en minuto 0 de la segunda hora del primer día de la semana"...
No he encontrado ninguna manera de probarlo, así que he creado otra tarea que se ejecutara al siguiente minuto para comprobar que todo funcionaba como debía. He añadido una línea al script para tener un pequeño "comprobante" de que el job se había ejecutado:
echo $fecha 'Job done!' >> backup.logs
También puedes comprobar que el job se ha ejecutado a través de:
grep CRON /var/log/syslog
No te preocupes si ves una líneas con un mensaje como:
info (No MTA installed, discarding output)
cron intenta enviar un correo al usuario con el resultado de la ejecución de la tarea programada, pero como no hay un servidor de correo (Mail Transport Agent), informa de ello en el log.
Subiendo el nivel
Con todo lo anterior ya tenemos un sistema de copias de seguridad básico. Para acceder a la copia de un día concreto, podemos hacerlo a través del navegador. Por ejemplo, para descargar la copia de hoy, usaríamos la URL http://192.168.1.50/2015-05-03-backup.tar.gz. Esto provocaría la descarga del fichero a nuestro disco duro.
No está mal, pero sería mucho mejor tener una página web donde se vaya añadiendo un enlace a cada fichero de copia de seguridad.
Creamos un fichero simple mediante nano, por ejemplo, y lo llamamos backup.html:
En el script de backup, añadimos la línea:
Esta línea llama al programa sed con el parámetro -i (insertar). A continuación, entre comillas simples, indicamos en qué línea queremos añadir el texto que sigue. Para poder insertar la variable tenemos que concatenar el texto con las variables. Finalmente, se inserta la línea especificada en el fichero backup.html.
Básicamente, el comando anterior inserta en la línea 5 del fichero backup.html un enlace al fichero del backup. Como el texto siempre se inserta en la 5 línea, los enlaces a los backups aparecen en orden inverso en la página, empezando siempre por el más reciente.
El resultado es algo así:
El resultado no es espectacular, pero es funcional.
Finalmente he añadido un enlace a esta página web desde Dokuwiki. Para ello he aprovechado la funcionalidad que proporciona el template básico de Dokuwiki -y la mayoría de temas, en general- de poder enganchar contenido en el wiki desde ficheros externos. En mi caso, he creado el fichero footer.html con un enlace a la página de backups para que sea más fácil acceder a ella:
Sería interesante añadir más capacidades a la web y convertirla en algo dinámico, permitiendo borrar ficheros directamente desde la web o lanzar un backup pulsando un botón. Para ello tendría que utilizar PHP.
Otra posibilidad es la subir los ficheros de backup a algún almacenamiento online, como Google Drive o Dropbox.
En cualquier caso, sigo aprendiendo y divirtiéndome con la Raspberry Pi.
En el script de backup, añadimos la línea:
Esta línea llama al programa sed con el parámetro -i (insertar). A continuación, entre comillas simples, indicamos en qué línea queremos añadir el texto que sigue. Para poder insertar la variable tenemos que concatenar el texto con las variables. Finalmente, se inserta la línea especificada en el fichero backup.html.
Básicamente, el comando anterior inserta en la línea 5 del fichero backup.html un enlace al fichero del backup. Como el texto siempre se inserta en la 5 línea, los enlaces a los backups aparecen en orden inverso en la página, empezando siempre por el más reciente.
El resultado es algo así:
El resultado no es espectacular, pero es funcional.
Finalmente he añadido un enlace a esta página web desde Dokuwiki. Para ello he aprovechado la funcionalidad que proporciona el template básico de Dokuwiki -y la mayoría de temas, en general- de poder enganchar contenido en el wiki desde ficheros externos. En mi caso, he creado el fichero footer.html con un enlace a la página de backups para que sea más fácil acceder a ella:
Mejoras
Entre las mejoras que espero poder añadir estaría la poder limitar el número de backups y que cuando se alcance el máximo, se eliminen los backups más antiguos.Sería interesante añadir más capacidades a la web y convertirla en algo dinámico, permitiendo borrar ficheros directamente desde la web o lanzar un backup pulsando un botón. Para ello tendría que utilizar PHP.
Otra posibilidad es la subir los ficheros de backup a algún almacenamiento online, como Google Drive o Dropbox.
En cualquier caso, sigo aprendiendo y divirtiéndome con la Raspberry Pi.
Comentarios